package com.runa.monitor.platinterface.meter3_0.handle;

import com.runa.persistence.util.SpringContextUtil;
import com.runa.monitor.platinterface.meter3_0.session.SessionManager;
import com.runa.monitor.platinterface.meter3_0.session.SessionProxy;
import com.runa.monitor.platinterface.backwork.function.TaskFunction;
import lombok.extern.slf4j.Slf4j;

import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
import java.util.Map;

/**
 * @author diandian
 * @Date 2022/11/20 14:44
 */
@Slf4j
public class MeterMsgHandler implements MessageHandler.Whole<String> {
    private EndpointConfig config;
    private Session session;
    private String identity;

    public MeterMsgHandler(Session session, EndpointConfig config, String identity) {
        this.config = config;
        this.session = session;
        this.identity = identity;
    }

    @Override
    public void onMessage(String message) {
        log.info("琅卡博3.0 onMessage MeterMsgHandler---"+message);
        SessionManager sessionManager = SpringContextUtil.getBean(SessionManager.class);
        //接受到数据，对状态进行标记
        sessionManager.notifyReceiveMsg(identity, message);

        //接受到数据后，通知发送端可以发送下一条数据，因为整体设计，是按照一个网络设备一个session的结构，上位处理的指令的时候，要一问一答的方式发送数据，
        Map<String, Object> userProperties = session.getUserProperties();
        TaskFunction function = (TaskFunction) userProperties.get(SessionProxy.SessionKey.taskId.name());
        //因为同一个网络设备返回的数据格式也不一定相同，所以处理器也是动态的，根据发送的指令，才能知道接受的数据应该用什么样的方式进行处理。
        ResponseBusinessHandler handler = (ResponseBusinessHandler) userProperties.get(SessionProxy.SessionKey.resultHandler.name());
        if (handler == null) {
            System.out.println("没有找到对应的业务处理器");
            return;
        }

        handler.handleBusiness(userProperties, function, message);
        //消息处理结束，通知
        sessionManager.notifyEndHandleMsg(identity);
    }
}
